package logic

import (
	"Forum/dao/mysql"
	"Forum/models"
	"Forum/pkg/jwt"
	"Forum/pkg/snowflake"
	"go.uber.org/zap"
)

// SignUp 用户注册函数
// 参数 p 包含用户输入的用户名和密码
// 返回值 error 用于返回注册过程中可能发生的错误
func SignUp(p *models.ParamSignUp) (err error) {
	// 1.判断用户存不存在
	if err := mysql.CheckUserExist(p.UserName); err != nil {
		// 数据库查询出错
		return err
	}
	// 2.生成UID
	userID := snowflake.GetID()
	if err != nil {
		zap.L().Error("user snowflake.GenID failed.", zap.Error(err))
		return
	}
	// 构造一个User实例
	user := &models.User{
		UserID:   userID,
		UserName: p.UserName,
		Password: p.RePassword,
	}
	// 3.密码加密并保存进数据库
	return mysql.InsertUser(user)
	// redis.xxx ...
}

// Login 用户登录函数
// 参数 p 包含用户输入的用户名和密码
// 返回值 user 是登录成功的用户信息，包括用户ID、用户名和令牌(Token)
func Login(p *models.ParamLogin) (user *models.User, err error) {
	// 初始化用户信息，包括用户名和密码
	user = &models.User{
		UserName: p.UserName,
		Password: p.Password,
	}
	// 调用mysql.Login函数执行登录操作，如果登录失败，返回错误信息
	if err := mysql.Login(user); err != nil {
		return nil, err
	}
	// 生成用户登录令牌(Token)，如果生成失败，返回错误信息
	user.Token, err = jwt.GenToken(user.UserID, user.UserName)
	if err != nil {
		return
	}
	// 登录成功，返回用户信息
	return
}
